package sunlight.logger;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import sunlight.util.TheTime;

/**
 * Util pentru a scrie fisiere de tip log; Fiserele vor fi stocate la calea logs_dir, parametrul constructorului cu un singur parametru.
 * Numele fisierelor rezultate sunt generate in functie de variabila DATE_FORMAT la care se adauga extensia FILE_EXT; astfel
 * pot fi create fisiere log odata pe an pana la o data pe secunda.
 * De asemenea numele fisierului poate fi specificat si utilizand constructorul cu 2 parametri.
 * 
 * @author adrian
 * @version 1.0
 */
public class FileEventLogger implements EventLogger{
	
	/**
	 * acesta scrie in fisier, usureaza mult accesul si scrierea fiind un obiect de tip PrintWriter 
	 */
	protected PrintWriter log;
	
	public String Dir;
	public String Filename;
	
	public FileEventLogger() throws IOException{
		this.Dir 		= "logs/";
		this.Filename = TheTime.now(DATE_FORMAT);
		
		this.open();
	}
	
	/**
	 * constructor explicit, parametrul specifica directorul in care va fi stocat fisierul log
	 * numele fisierului generat va avea forma &lt;DATE_FORMAT&gt;&lt;FILE_EXT&gt; 
	 * @param logs_dir
	 * @throws IOException
	 */
	public FileEventLogger(String dir) throws IOException{
		this.Dir	  = dir;
		this.Filename = TheTime.now(DATE_FORMAT);
		
		this.open();
	}
	
	/**
	 * constructor explicit, cei doi parametrii specifica directorul in care va fi stocat fisierul si numele fisierui log
	 * @param logs_dir
	 * @param filename
	 * @throws IOException
	 */
	public FileEventLogger(String dir, String filename) throws IOException{
		this.Dir 	  = dir;
		this.Filename = filename;
		
		this.open();
	}
	
	
	/*
	 * creeaza, deschide si initializeaza fisierul log si obiectul PrintWriter utilizat pentru a-l accesa
	 */
	public void open() throws IOException{
		
		//---creeaza obiectul simbolizand fisierul fizic-----------//
		File logfile = new File(this.Dir + this.Filename + FILE_EXT);
		
		boolean append = true;		//presupune ca fisierul exista si implicit vom face adaugare
		
		if(!logfile.exists()){		//fisierul nu exista - se creeaza unul nou
			logfile.createNewFile();
			append = false;			//in acest caz, nu mai facem adaugare;
		}
		
		//---initializeaza un filewriter conform (cu adaugare sau nu)
		FileWriter logstream = new FileWriter(logfile, append);
		
		
		//---creeaza printwriter-ul-------------------//
		this.log = new PrintWriter(logstream);
		
		//----initializeaza log-ul--------------//
		this.init();
	}
	
	/**
	 * Scrie prima linie in fisierul log
	 */
	
	/**
	 * Tipareste, conform format-ului LOG_FORMAT mesajul in fisierul log, asociindu-i tipul specificat.
	 * Tipul mesajului este recomandat sa fie unul din tipurile EventLogger.WARNING, EventLogger.ERROR sau EventLogger.MESSAGE
	 * 
	 * @param message
	 * @param type
	 */
	public void write(String message, String type){
		String date = TheTime.now(DATE_FORMAT);
		String time = TheTime.now(TIME_FORMAT);
		
		String line = new String(LOG_FORMAT);
			   
		line = line.replaceAll("<date>", date);
		line = line.replaceAll("<time>", time);
		line = line.replaceAll("<message>", message);
		line = line.replaceAll("<type>", type);
		
		this.log.println(line);
		this.log.flush();
	}
	
	/**
	 * Scrie ultima linie in fisierul log si inchide stream-ul asociat fisierului
	 */
	public void close(){
		this.write("___________Aplicatia a fost oprita______________", MESSAGE);

		this.log.close();
	}

	@Override
	public void delete(String logname) {
		// TODO Auto-generated method stub
	}

	@Override
	public void init() {
		this.write("___________Aplicatia a fost pornita_____________", MESSAGE);
	}
}
